/*
 * Copyright © 2020 luoluo334.All rights reserved. 
 * 功能介绍：
 *  全局[音量-]监听，5秒内连续按下了5次音量-，则停止程序。`System.exit(0);`
 *  悬浮窗[按键]，点击时触发m.menu函数。
 *  悬浮窗[主要]，就是一个浏览器。
 *  当浏览器尝试下载mimetype为auto/js（不分大小写）时会尝试当成脚本运行，
 *      但是只能将代码携带在url中。如果mimetype是auto/JS（区分大小写）时
 *      将会使用引擎来进行代码的运行。
 * 
 * 开发者可拓展部分：
 *  在程序创建悬浮窗之前会加载本地路径为"/sdcard/.br.js"的一个js文件，此时
 *      可以修改的变量有:m,runCodeDownloadListener,alpha,Url,width,height
 *      m <object> 存在的属性 
 *          main <floaty> [主要] 悬浮窗 
 *          controlbar <floaty> [按键] 悬浮窗
 *          survival <boolean> 存活标记
 *          menu <function> 点击[按钮]之后触发的函数
 *          language <object> 翻译,key为要翻译的话，包括换行符号\n
 *          getOfWords <function> 获取翻译
 *      runCodeDownloadListener <function> 下载监听器
 *      alpha <number> [主要] 范围0~1，控制透明度
 *      Url <String> [主要] 创建完之后加载的网页链接
 *      width <number> [主要] 宽度
 *      height <number> [主要] 高度
 *      AutoJsExecute <function> 运行器，默认的下载监听器调用这个函数时会
 *          传递两个参数(code, mode)，分别是 
 *              code <string> 代码
 *              mode <boolean> 模式
 *  在网页中嵌入如下js代码，即可向脚本发送想要执行的代码
        var autojsDownloadTagA;
        function autojs(code, mode) {
            if(!autojsDownloadTagA) {
                // 创建a标签
                autojsDownloadTagA = document.createElement('a');
                autojsDownloadTagA.download = "要执行的代码.js";
                autojsDownloadTagA.style.display = 'none';
                document.body.appendChild(autojsDownloadTagA);
            }
            autojsDownloadTagA.href = "data:auto/js;charset=utf-8,\n"+code;
            autojsDownloadTagA.click();
        }
 *      执行时只需调用 autojs('log("代码内容")')
 */

// 音量键监听，之后嵌入到内部
{
    events.observeKey();
    let volumeDownClickNumber = 0;
    let limit = 5;
    events.onKeyDown("volume_down", function () {
        if (volumeDownClickNumber < 0) {
            volumeDownClickNumber = 0;
        }
        volumeDownClickNumber += 1;
        if (limit < volumeDownClickNumber) {
            java.lang.System.exit(0);
        }
        if (limit * 0.5 < volumeDownClickNumber) {
            toastLog("再按" + volumeDownClickNumber - limit + "次强行停止")
        }
        setTimeout(() => { volumeDownClickNumber--; }, 1000 * limit);
    });
}

var m = {
    language: {},
    getOfWords: function (key) {
        return this.language[key] || key;
    },
    main: null,
    controlbar: null,
    survival: true,
    menu: function () {
        toastLog(m.getOfWords('未重写菜单操作\n长按可退出程序'));
    },
};
var lang = m.getOfWords
// 创建浏览器与操作按钮
{
    // 创建监听函数，用于监听下载请求
    function runCodeDownloadListener(url, userAgent, contentDisposition, mimetype, contentLength) {
        let index, MimeTypeThrow = m.getOfWords("使用第三方程序进行下载"), mark = m.getOfWords("code:");
        log(url, userAgent, contentDisposition, mimetype, contentLength)
        try {
            if (m.getOfWords("auto/js") == mimetype.toLowerCase()) {
                if (-1 < (index = url.indexOf(mark))) {
                    // 当mimetype小写后是 auto/js时执行脚本
                    AutoJsExecute(decodeURI(url.substring(index+mark.length)));
                } else throw m.getOfWords("未找到标注：") + mark;
            } else throw MimeTypeThrow;
        } catch (err) {
            console.error(m.getOfWords("监听器异常啦~"));
            console.log(err);
            if (err == MimeTypeThrow) app.openUrl(url);
            else console.log(err.stack);
        }
    }
    
    let alpha = 0.8, Url = m.getOfWords("file://"+files.path("./resources/main.html")),
        width = device.width, height = device.height * 0.7;
    // 运行本地的一个js文件
    if (files.isFile(".br.js")) {
        try {
            eval(files.read(".br.js"));
        } catch (err) {
            console.log(err + "\n" + err.stack);
        }
    }
    // 创建悬浮窗，优先创建的悬浮窗会处于底层
    m.main = floaty.rawWindow(<frame bg="#20778899" w="*" h="*"> <webview id="wv" bg="#00112233" /> </frame>);
    m.controlbar = floaty.rawWindow(<img id="but" w="30dp" h="30dp" bg="#778899"></img>);
    m.controlbar.setPosition(device.width * 0.5, device.height * 0.5);
    m.main.wv.setBackgroundColor(0);
    m.main.wv.getBackground().setAlpha(0);
    m.main.wv.setAlpha(alpha);
    m.main.setSize(width, height);
    // 事件绑定
    ui.run(() => {
        m.main.wv.loadUrl(Url);
        // 设置自定义下载监听器
        m.main.wv.setDownloadListener(runCodeDownloadListener);
    });

    // 设置监听状态
    m.main.wv.on("key", function(keyCode, event){
        if(event.getAction() == event.ACTION_DOWN || keyCode == keys.back){
            m.main.disableFocus();
            event.consumed = true;
        }
    });
    m.main.wv.on("touch_down", ()=>{
        m.main.requestFocus();
        m.main.wv.requestFocus();
    });   

    m.controlbar.but.on("click", m.menu);
    m.controlbar.but.on("long_click", () => { m.survival = false });
}

function AutoJsExecute(code) {
    code = code.replace(/\\\\\\\\/g,"\\");
    log(m.getOfWords("代码内容：\n") + code);
    threads.start(function(){
        // 记录启动时间
        let startTime = Date.now();
        // 运行代码
        eval(code);
        // 输出本次运行消耗的时间
        console.verbose(m.getOfWords("运行结束。本次耗时(ms)："), Date.now() - startTime, m.getOfWords("ms"));
    });
}

// 续命存活
setInterval(() => {
    if (!m.survival) {
        toastLog(m.getOfWords("Bye~"));
        exit();
    }
}, 1000);
